// ! 精通
// todo 一句话，它就是 Generator 函数的语法糖。
// todo async函数就是将 Generator 函数的星号（*）替换成async，将yield替换成await，仅此而已。

/*
  （1）内置执行器。
  （2）更好的语义。
  （3）更广的适用性。
  （4）返回值是 Promise
*/

const fs = require("fs");

const sleep = (time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
    }, time);
  });
};

const read = (url) => {
  return new Promise((resolve, reject) => {
    fs.readFile(url, "utf-8", (err, data) => {
      if (err) {
        reject(err);
      }
      resolve(data);
    });
  });
};

// todo 从上往下进行执行，直到遇到第一个await关键字停下来, 会等到await后面的promise对象出结果, 继续往后，知道遇到下一个await
async function fn() {
  console.log(123);
  await sleep(3000);
  console.log(456);
  const res = await read("./03-promise.js");
  console.log(res);
  const res2 = await read("./01-事件.html");
  console.log(res2);
}

fn();
